package cn.dai.test.da.queue;

/**
 * @author ArkD42
 * @file Jdbc01
 * @create 2020 - 06 - 07 - 16:37
 */

// 环形队列
public class CircleQueueDemo {

    private int maxSize;    //最大长度
    private int front;      //队列头位置，初始值为0，指向第一个元素位置
    private int rear;       //队列尾位置，初始值为0，指向最后一个元素的位置，因为数组还没有长度，则默认和front一个位置
    private int[] array;    //模拟队列，

    // 初始化要求必须声明最大长度
    public CircleQueueDemo(int maxSize) {
        this.maxSize = maxSize;

        // 注入最大长度完成初始化
        array = new int[this.maxSize];

        // 指向队列的头部，是队列头的前一个位置
        front = 0;

        // 指向队列的尾，队列的最后一个数据
        rear = 0;
    }

    // 判断队列是否为满？
    public boolean isFull(){
        // 动态的判断是否和头标一样了
        return (rear + 1) % maxSize == front;
    }

    // 判断队列是否为空？
    public boolean isEmpty(){
        return front == rear;
    }

    // 添加数据
    public void addQueue(int element){

        // 判断队列是否为满
        if (isFull()) {
            System.out.println("队列已满！！！");
            return;
        }

        array[rear] = element;
        rear = (rear + 1) % maxSize;
    }

    // 取出数据，头标前移
    public int getElement(){

        if (isEmpty()){
            // System.out.println("队列为空！！！");
            // return -1;
            throw new RuntimeException("队列为空！！！");
        }

        // 因为front也会加到队列的末端，所以一样需要动态的调整
        int temp = array[front];
        front = (front + 1) % maxSize;
        return temp;
    }



    // 展示队列
    public void showSequence(){

        if (isEmpty()) {
            System.out.println("队列为空！！！");
            return;
        }

        for (int i = front; i < front + size(); i++) {
            System.out.printf("array[ %d ] = %d  \n",i % maxSize,array[i % maxSize]);
        }

    }

    // 获取当前有效长度
    public int size(){ // 这样环形的长度可以动态的保持
        return (rear + maxSize - front) % maxSize;
    }

    // 得到头元素
    public int showHead(){
        if (isEmpty()) throw new RuntimeException("队列为空！！！");
        return array[front];
    }

}
